package com.itheima.stock.stream;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;

/**
 体验Stream流的好处

 需求：按照下面的要求完成集合的创建和遍历

 1 创建一个集合，存储多个字符串元素
 "张无忌" , "张翠山" , "张三丰" , "谢广坤" , "赵四" , "刘能" , "小沈阳" , "张良"
 2 把集合中所有以"张"开头的元素存储到一个新的集合
 3 把"张"开头的集合中的长度为3的元素存储到一个新的集合
 4 遍历上一步得到的集合

 此时我们会发现使用原始方法非常复杂，而且效率不高，所以使用Stream流来简化操作

 重点：
 stream().filter() 过滤
 */
@SpringBootTest
public class StreamDemo1 {
    @Test
    public void StreamTest1(){
        //传统方式完成
        ArrayList<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("张翠山");
        list.add("张三丰");
        list.add("谢广坤");
        list.add("赵四");
        list.add("刘能");
        list.add("小沈阳");
        list.add("张良");

        //2 把集合中所有以"张"开头的元素存储到一个新的集合
        ArrayList<String> Zlist = new ArrayList<>();
        for (String name: list) {
            if (name.startsWith("张")){
                Zlist.add(name);
            }
        }
        System.out.println("姓李的有：" + Zlist);

        //3 把"张"开头的集合中的长度为3的元素存储到一个新的集合
        ArrayList<String> Z3list = new ArrayList<>();
        for (String name : list) {
            if (name.startsWith("张")&&name.length()==3){
                Z3list.add(name);
            }
        }
        System.out.println("姓李的长度为3的有：" + Z3list);

        //我们会发现使用原始方法非常复杂，而且效率不高，所以使用Stream流来简化操作
        /**
         * list.stream()：这一步就像是把名单上的每个人都排成一列，准备进行筛选。
         * .filter(name -> name.startsWith("张") && name.length() == 3)：这是筛选的过程。对于名单上的每个人名（我们这里把它叫做name），检查它是否同时满足两个条件：首先是名字的第一个字是不是“张”，然后看这个名字是不是刚好由三个字组成。如果都满足，这个人名就会被保留下来进入下一步。
         * .forEach(name -> System.out.println(name));：这部分就像是对筛选后剩下的人名一个个喊名字。对于每一个符合条件的名字，就通过System.out.println(name)这条命令把它打印出来，相当于喊出这些名字。
         * 综上所述，这段代码的功能就是查找名单中所有姓张且名字长度为3个字符的人，并挨个儿把这些名字打印出来。
         */
        list.stream().filter(name -> name.startsWith("张")&&name.length()==3).forEach(
                name -> System.out.println(name));

    }
}
